//package com.beyondsoft.sabg.edu.business.schedule;
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.beyondsoft.sabg.edu.model.db.StudentInfo;
//import com.beyondsoft.sabg.edu.model.db.dataloader.YJSJBXX;
//import com.beyondsoft.sabg.edu.repository.StudentRepo;
//import com.beyondsoft.sabg.edu.utils.CodeUtils;
//import com.beyondsoft.sabg.edu.utils.RequestUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.EnableScheduling;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import javax.transaction.Transactional;
//import java.time.LocalDateTime;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @Author Mo cr
// * @Date 2025/2/17
// */
//@Component
//@EnableScheduling
//@Slf4j
//public class UpdateStudentInfoSchedule {
//    @Autowired
//    private StudentRepo studentRepo;
//
//    @Autowired
//    private StudentUpdateRecordRepo updateRecordRepo;
//
//    private static final int BATCH_SIZE = 1000;
//
//    private String accessToken;
//    private LocalDateTime tokenExpireTime;
//    private static final long TOKEN_VALID_MINUTES = 120; // token有效期为2小时
//
//    @Scheduled(cron = "0 0 3 * * ?")
//    public void updateStudentInfo() {
//        log.info("开始更新学生信息...");
//        // 获取或更新token
//        refreshTokenIfNeeded();
//
//        // 分批处理学生数据
//        int offset = 0;
//        while (true) {
//            List<StudentInfo> studentBatch = studentRepo.findAll()
//                    .stream()
//                    .skip(offset)
//                    .limit(BATCH_SIZE)
//                    .collect(Collectors.toList());
//
//            if (CollectionUtils.isEmpty(studentBatch)) {
//                break;
//            }
//
//            // 获取学号列表
//            List<String> studentNumbers = studentBatch.stream()
//                    .map(StudentInfo::getStudentNumber)
//                    .collect(Collectors.toList());
//
//            // 批量获取线上数据
//            List<YJSJBXX> onlineInfoList = getStudentInfoList(studentNumbers);
//            if (CollectionUtils.isEmpty(onlineInfoList)) {
//                log.error("获取线上数据失败，跳过当前批次");
//                offset += BATCH_SIZE;
//                continue;
//            }
//
//            // 将线上数据转换为Map便于查找
//            Map<String, YJSJBXX> onlineInfoMap = onlineInfoList.stream()
//                    .collect(Collectors.toMap(YJSJBXX::getXH, info -> info));
//
//            // 更新每个学生的信息
//            for (StudentInfo localInfo : studentBatch) {
//                try {
//                    updateSingleStudent(localInfo, onlineInfoMap.get(localInfo.getStudentNumber()));
//                } catch (Exception e) {
//                    log.error("更新学生信息失败，学号：" + localInfo.getStudentNumber(), e);
//                }
//            }
//
//            offset += BATCH_SIZE;
//        }
//
//        log.info("学生信息更新完成");
//    }
//
//    @Transactional
//    protected void updateSingleStudent(StudentInfo localInfo, YJSJBXX onlineInfo) {
//        if (onlineInfo == null) {
//            log.warn("未找到学生{}的线上数据", localInfo.getStudentNumber());
//            return;
//        }
//
//        List<StudentUpdateRecord> updateRecords = new ArrayList<>();
//
//        // 比对并更新各个字段
//        updateField(localInfo, "studentStatus",
//                localInfo.getStudentStatus(),
//                CodeUtils.convertStatus(onlineInfo.getXJZT()),
//                updateRecords);
//
//        updateField(localInfo, "studentCultivationMode",
//                localInfo.getStudentCultivationMode(),
//                CodeUtils.convertCultivationMode(onlineInfo.getPYFSDM()),
//                updateRecords);
//
//        updateField(localInfo, "studentTags",
//                localInfo.getStudentTags(),
//                onlineInfo.getXSBQ(),
//                updateRecords);
//
//        updateField(localInfo, "studentStudyType",
//                localInfo.getStudentStudyType(),
//                CodeUtils.convertStudyType(onlineInfo.getXXFSDM()),
//                updateRecords);
//
//        updateField(localInfo, "studentInSchool",
//                localInfo.getStudentInSchool(),
//                onlineInfo.getSFZX(),
//                updateRecords);
//
//        updateField(localInfo, "studentPlan",
//                localInfo.getStudentPlan(),
//                onlineInfo.getZXJH(),
//                updateRecords);
//
//        // 如果有更新，保存学生信息和更新记录
//        if (!updateRecords.isEmpty()) {
//            localInfo.setLastUpdateTime(LocalDateTime.now());
//            studentRepo.save(localInfo);
//            updateRecordRepo.saveAll(updateRecords);
//        }
//    }
//
//    private void updateField(StudentInfo student, String fieldName, String oldValue, String newValue,
//            List<StudentUpdateRecord> updateRecords) {
//        if (Objects.equals(oldValue, newValue)) {
//            return;
//        }
//
//        // 反射设置新值
//        try {
//            student.getClass().getMethod("set" + fieldName.substring(0, 1).toUpperCase() +
//                    fieldName.substring(1), String.class)
//                    .invoke(student, newValue);
//
//            // 记录更新
//            StudentUpdateRecord record = new StudentUpdateRecord();
//            record.setStudentNumber(student.getStudentNumber());
//            record.setFieldName(fieldName);
//            record.setOldValue(oldValue);
//            record.setNewValue(newValue);
//            record.setUpdateTime(LocalDateTime.now());
//            updateRecords.add(record);
//        } catch (Exception e) {
//            log.error("更新字段{}失败", fieldName, e);
//        }
//    }
//
//    /**
//     * 检查并刷新token
//     */
//    private void refreshTokenIfNeeded() {
//        if (accessToken == null || tokenExpireTime == null || LocalDateTime.now().isAfter(tokenExpireTime)) {
//            log.info("Token不存在或已过期，重新获取token");
//            accessToken = RequestUtils.acquireAccessToken();
//            tokenExpireTime = LocalDateTime.now().plusMinutes(TOKEN_VALID_MINUTES);
//            log.info("Token更新成功，有效期至：{}", tokenExpireTime);
//        }
//    }
//
//    /**
//     * 研究生基本信息查询
//     */
//    public List<YJSJBXX> getStudentInfoList(List<String> studentNumberList) {
//        // 使用已缓存的token
//        String url = "https://dmp.xidian.edu.cn:8771/open_api/customization/tgxxsyjsjbxx/full?access_token=" + accessToken;
//
//        //定义发送数据
//        JSONObject param = new JSONObject();
//        JSONObject studentList = new JSONObject();
//        JSONArray numberArray = new JSONArray();
//        numberArray.addAll(studentNumberList);
//
//        studentList.put("in", numberArray);
//        param.put("XH", studentList);
//        param.put("per_page", 1000);
//
//        JSONObject response = RequestUtils.sendPostRequest(url, param);
//        Integer code = response.getInteger("code");
//
//        if (99999 == code) {
//            String description = response.getString("description");
//            log.error("API调用失败，错误码：99999，原因：{}", description);
//            return new ArrayList<>();
//        }
//
//        JSONObject result = response.getJSONObject("result");
//        return JSONObject.parseArray(result.getString("data"), YJSJBXX.class);
//    }
//}
